perm filename CKBZ.OLD[1,ALS] blob
sn#511861 filedate 1980-05-28 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00027 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00005 00002 TITLE CKB BASIC CHECKER ROUTINES 6/8/77
C00009 00003 MESSF BEGIN BEGINN ST2 ST1 INTERP ERR COMEND SKP
C00013 00004 TERPRI PRINT PRIN2 PRIN1 RJOUT RJ4 RJ2 NUMOUT NUM2 NUM3 TYO CPOPJ NUMX1 NUMX2 IBF OBF LPTBUF PDL RPDL
C00016 00005 SCAN SCAN1 SCAN2 SCAN5 SCAN7 SCAN6 SCAN15 SCAN10 SCAN11 SCAN8 SCAN9
C00021 00006 SCAN3 SCAN13 SCAN14 SCAN12 TYI TYI1
C00023 00007 SCNTBL
C00024 00008 IDBUF LASCAR HELP MTYPE MESS1 MESS2
C00028 00009 IDTBL SYM'XX NOB BOOK USEBOK
C00032 00010 LPTFIX NOYES
C00034 00011 EOL CHSET NOTICE DECIN OCTIN OCTOUT OCT0 OCT1 OCT2 OCT3
C00038 00012 LIST PITRY STOPL LSTART
C00041 00013 DUMP DUMP0 DUMP1 DUMP2 DUMP3 PRNAM3 PRNAM1 PRNAM2 SPT PRNAME TYPE
C00046 00014 OUTIN GETTTY MAG MAGTAP MAGIN GETOK DNUM MAGOUT PUTOK NEWLIN NOTAVL INERR WRTPRO PARERR INVBLK
C00050 00015 FIXDAT NEWCAR NEXCHR TRCARD TRCAR1 CRLF STAR STAR0 STAR1 GETLIN DBP DONE FLUSH FLUSH1
C00054 00016 D1BYT D2BYT INPL MGIBUF MGOBUF SAVBUF TPUNIT DATE MONTH EXIT
C00056 00017 PUP PRF PLF PLB
C00059 00018 UPDATE UPDAT2 DEEPER TENIN RFMJ LFMJ LBMJ FOO MJPF RFPF LFPF LBPF NOPF PDP10
C00068 00019 COUNTS SAVE BJUMP1 FJUMP1 JUMP2 SIXTEN KINGSQ
C00070 00020 LEGAL LEG1 LEG2 LEG3 LEG4 LEG5 LEG6 GUARD
C00073 00021 PLGRD PLA PLP PLK PLRF PLLF PLLB PLRB EEB EEB2 PLSKIP TA TP TK PLY PLAS PLPS PLKS PLSKS PLRFS PLLFS PLLBS PLRBS PLMJS COUNT ORDER ORDER2 BEST BEST2 TRUNK COLOR WORST TISKIP XTWIG OJ BESTM WORSTM BESTO EW X1S X2S X2SS X3S X4S U1S U2S U2SS ZS STOP SI LASTP DOTFLG FLITEV PLEVAL TIPEV DEPTH PRUNE WIDTH TAPER MJBP BPBP PLFLG FLAG REFLAG LPFLAG DWFLAG SFLAG WHOWON EEBFLF MJW
C00076 00022 SCORE S GOOD BAD WIN LOSE ZZ OA OP OK ORF OLF OLB ORB OS DA DP DK SIDE START FINISH ACSAV SAVU1 SAVX2 BITSON
C00078 00023
C00082 00024 FINDX1 CNT FINDX2 FINDX3 INS1AB INS1B INS1C INS1F INS1G INS3 INS3K1 INS3K2 INS3K3 INS3K INS3X INS3Y INS3Z
C00090 00025 CRIP X4NORM
C00092 00026 X4ALL X4RF X4LF X4LB X4RB X4TAB BITTAB REVTAB REVERK REVERA REVERP REVBP RBP
C00094 00027 WHERES GETWHR WHERIN WHRINS
C00096 ENDMK
C⊗;
TITLE CKB BASIC CHECKER ROUTINES 6/8/77
; REGISTER ASSIGNMENTS
;ASSIGNMENT USAGE
Z=0
X1=1 ; INDEX MAIN
U1=2
X2=3 ; INDEX PATH
U2=4
X3=5 ; INDEX PLAUS
U3=6
X4=7 ; INDEX TWIG
U4=10
X5=11 ; PASS COLOR
U5=12
Q=13
A=14 ; ACTIVE
P=15 ; PASSIVE
K=16 ; KINGS
PDP=17 ; PUSHJ
INTERN ACSAV,BAD,BEGIN,BEGINN,BEST,BEST2,BESTM,BESTO,BITSON,NOTICE
INTERN ZS,XTWIG,X4S,X2SS,X2S,X1S,WORSTM,WIDTH,WIN
INTERN BPBP,COLOR,COMEND,COUNT,DECIN,DEPTH,DOTFLG,DWFLAG,UPDATE
INTERN EOL,ERR,FINISH,FLAG,GOOD,GUARD
INTERN IBF,INTERP,LASCAR,LASTP,LEGAL,LOSE,LIST,PRNAME,GETTTY
INTERN FIXDAT,COUNTS,DATE,USEBOK
INTERN MAG,MAGIN,MAGTAP,MAGOUT,NEWLIN,RJ2,RJ4,PLY,TA,TP,TK
INTERN LPFLAG,LPTFIX,LRPDL,MJ,MJBP,MJW,MTYPE,NOYES,NUMOUT
INTERN OA,OBF,OCT2,OCTIN,OCTOUT,OJ,OK,OLB,OLF,OP,ORDER,ORDER2,ORF
INTERN PLA,PLAS,PLFLG,PLK,PLKS,PLLB,PLLBS,ORB
INTERN PLLF,PLLFS,PLMJS,PLP,PLPS,PLRB,PLRBS,PLRF,PLRFS,PLSKIP,PLSKS
INTERN PRINT,PRUNE,PUP,REFLAG,RJOUT,RPDL,S,SAVE,SCAN,SCORE,SFLAG,SI
INTERN SIDE,START,STOP,TAPER,TERPRI,TISKIP,TRUNK,TYI,TYO,U2S,U2SS
INTERN ZZ,NUM2,NUM3,NOTAVL,TPUNIT,OUTIN,MGIBUF,MGOBUF
INTERN BITTAB,TYI,CRIP
INTERN FINDX1,CRIP,X4NORM,X4ALL,X4TAB
INTERN REVERA,REVERP,REVERK
INTERN LPTBUF,TYPE,GETWHR,DNUM
EXTERN TREFIX,DSTREE,BK,TABLST,TABFIX,PAR,XPAR,INPCNT
EXTERN BOOKA,BOOKP,BOOKK,BOOKM,BOOKI,INPA,INPP,INPK,LC
EXTERN ACCEPT,BDOUT,BOUT,CDIFF,CRFST,CRUNT,CSFLAG,CTELLC,CTOTAL
EXTERN D,DATA,DEBUG,DIFF,FSTCR,GO,LEGM,LPTREE,MOVOUT
EXTERN PB,PC,PLAYBS,PW,RUNT,SETB,SETW,SETPAR
EXTERN TELLC,TELPAR,TOTAL,TREE,TRESET,W
EXTERN LCONTS,MESS,LCONTZ,ZL,BEGL3
EXTERN BEGINL,DFILL,DSAVE,EV,HEADFL,INIT1,LBYT,LFLAG
EXTERN LZERO,MOVIN,RSAVE
EXTERN LZER2,LZER3,XEROX
EXTERN SIG,TRNKNO,DIVIDE,JOBSYM,LABEL
EXTERN FINDM,IA,CFTAB2,IP,IK,MOVES,RECIN,SUM,SYM
EXTERN MOP,MOVX,EXIT1,LOADTA,INDEXX,INDEXF
SIGSIZ=1732
DEFINE CAQ (U1,SUM) <;THIS MACRO COUNTS BITS IN U1+1
AND U1+1,GUARD
MOVE SUM,[POINT 9,U1+1]
MOVEM SUM,CAQBP
ILDB U1,CAQBP
MOVE SUM,BITSON(U1)
ILDB U1,CAQBP
ADD SUM,BITSON(U1)
ILDB U1,CAQBP
ADD SUM,BITSON(U1)
ILDB U1,CAQBP
ADD SUM,BITSON(U1)>
CAQBP: Z
ENTRY BEGIN ;STARTING POINT FOR CHECKERS PROGRAM.
I=Q
MJ=X5 ;NOTICE THAT TWO REGISTERS HAVE FOUR NAMES!
;NOTICE THAT J. SAUTER DOES NOT LIKE REGISTERS WITH 4 NAMES!
;MESSF BEGIN BEGINN ST2 ST1 INTERP ERR COMEND SKP
MESSF: -2
BEGIN: CALL [SIXBIT /RESET/] ;RESET ALL I/O
MOVE PDP,[IOWD LPDL,PDL] ;SET UP PUSH DOWN LIST.
PUSHJ PDP,GETTTY ;INIT TELETYPE
SETZM LPFLAG
PUSHJ PDP,TERPRI
PUSHJ PDP,TERPRI
MOVEI X1," "
PUSHJ PDP,TYO
PUSHJ PDP,DATE
PUSHJ PDP,TERPRI
SETZM LFLAG
AOSE MESSF
JRST BEGINN
MOVEI U1,MESS
PUSHJ PDP,PRINT
BEGINN: PUSHJ PDP,TERPRI
SETZM SIXTEN
JFCL 1,.+1
JUMPA .+1
JFCL 1,.+2
SETOM SIXTEN ;NOW "SIXTEN" = 0 IF PDP-6, = -1 IF PDP-10
SETZM HEADFL
SOS HEADFL
SETZM TRNKNO
SOS TRNKNO
SETZM DIFF
SETOM RUNT
SETZM TOTAL
SETZM TELLC
SETZM LPFLAG
SETZM TREE
SETOM SFLAG
SETZM DWFLAG
SETZM FSTCR
PUSHJ PDP,GETWHR ;SET UP WHERE TABLE ALWAYS
PUSHJ PDP,TERPRI ;START WITH CR-LF.
MOVEI U1,[BYTE (7) "1", "*", 11, 0]
PUSHJ PDP,PRINT
;
;HERE PLACE THE INITIALIZING ROUTINES FOR THE
;GAME PLAYING PART OF THE CHECKER PROGRAM.
;
PUSHJ PDP,INIT1 ;EVAL INITIALIZATION
SETZM BITSON ;ZERO BITSON TABLE
MOVE Z,[XWD BITSON,BITSON+1]
BLT Z,BITSON+400
MOVEI U1,377 ;SET UP BITSON TABLE
ST2: MOVEI U2,200
ST1: TDNE U1,U2
AOS BITSON(U1)
LSH U2,-1
JUMPN U2,ST1
SOJGE U1,ST2
MOVEI U1,1
MOVEM U1,SI
SETZM LASCAR ;INITIALIZE SCANNER.
MOVE A,DA
MOVE P,DP
MOVE K,DK
MOVEM A,OA
MOVEM P,OP
MOVEM K,OK
INTERP: PUSHJ PDP,SCAN ;SCAN A NUMBER, IDENTIFIER,
;OR SPECIAL CHARACTER.
PUSH PDP,[EXP COMEND];RETURN WITH A POPJ
JUMPL U1,MOVIN ;JUMP ON NUMBER.
TLNE U1,100000 ;IDENTIFIER WITH MEANING AT
;THIS POINT?
JRST (U1) ;YES. GO TO THE ROUTINE TO
;INTERPRET IT.
CAIN U1,15 ;CARRIAGE-RETURN?
JRST CRFST ;YES.
;OTHERWISE ERROR.
ERR: MOVE PDP,[IOWD LPDL,PDL] ;RESET PUSH-DOWN LIST.
PUSHJ PDP,TERPRI ;CR-LF.
MOVE U1,SI ;KEEP SI IN RANGE
CAIL U1,1 ;?
CAILE U1,1000
MOVEI U1,1
MOVEM U1,SI
COMEND: MOVE U1,SI ;PRINT CURRENT MOVE NUMBER.
MOVE U2,U1
PUSHJ PDP,NUMOUT
OUTSTR [ASCIZ/* /]
SKP: PUSHJ PDP,SCAN ;SKIP TO A CR OR ALT MODE.
CAIE U1,175 ;ALT MODE?
CAIN U1,12 ;NO. LINE FEED?
JRST INTERP ;ONE OR THE OTHER. GO INTERPRET.
JRST SKP ;NEITHER. SKIP SOME MORE.
;TERPRI PRINT PRIN2 PRIN1 RJOUT RJ4 RJ2 NUMOUT NUM2 NUM3 TYO CPOPJ NUMX1 NUMX2 IBF OBF LPTBUF PDL RPDL
;OUTPUT UTILITY SUBROUTINES.
TERPRI: MOVEI U1,[BYTE (7) 15,12,0] ;CR-LF.
PRINT: MOVEM X1,NUMX1
MOVEM X2,NUMX2
PUSHJ PDP,PRIN2
MOVE X1,NUMX1
MOVE X2,NUMX2
POPJ PDP,
PRIN2: HRLI U1,(POINT 7,0) ;SET UP BYTE POINTER.
PRIN1: ILDB X1,U1
JUMPE X1,CPOPJ ;RETURN ON FINAL ZERO.
PUSHJ PDP,TYO ;PRINT CHARACTER.
JRST PRIN1
RJOUT: SETZM X2
SKIPGE U1
SOS X2
MOVM Z,U1
CAMGE Z,[↑D1000000]
ADDI X2,1
RJ4: CAIGE Z,↑D100000
ADDI X2,1
CAIGE Z,↑D10000
ADDI X2,1
RJ2: CAIGE Z,↑D1000
ADDI X2,1
CAIGE Z,↑D100
ADDI X2,1
CAIGE Z,↑D10
ADDI X2,1
JUMPLE X2,NUM2
MOVEI X1," "
PUSHJ PDP,TYO
SOJG X2,.-2
JRST NUM2
;NUMOUT CLOBBERS U1+1 AND X1.
NUMOUT: MOVEM X1,NUMX1
MOVEM X2,NUMX2
PUSHJ PDP,NUM2
MOVE X1,NUMX1
MOVE X2,NUMX2
POPJ PDP,
NUM2: JUMPGE U1,NUM3
MOVEI X1,"-"
PUSHJ PDP,TYO
MOVNS U1
NUM3: IDIVI U1,12 ;ALWAYS DECIMAL.
HRLM U1+1,(PDP) ;SAVE REMAINDER
JUMPE U1,.+2
PUSHJ PDP,NUM3 ;RECUR TO GET MORE DIGITS.
HLRZ X1,(PDP)
ADDI X1,"0" ;CONVERT TO ASCII.
TYO:
JRST .+7 ;M28 BYPASS
SKIPG LPFLAG ;WHERE TO?
JRST .+5 ;TTY
SOSG LPTBUF+2 ;LPT
OUTPUT 2,
IDPB X1,LPTBUF+1
POPJ PDP,
IDPB X1,OBF+1
OUTPUT 1,0 ;FORCE BUFFER TERMINATION IMMEDIATELY.
CPOPJ: POPJ PDP, ;COMMON RETURN
NUMX1: Z
NUMX2: Z
IBF: BLOCK 3 ;BUFFER POINTERS FOR TTY INPUT.
OBF: BLOCK 3 ;DITTO FOR TTY OUTPUT.
LPTBUF: BLOCK 3
LPDL==100 ;PDL = 100 WORDS IN LENGTH.
LRPDL==50
PDL: BLOCK LPDL
RPDL: BLOCK LRPDL
;SCAN SCAN1 SCAN2 SCAN5 SCAN7 SCAN6 SCAN15 SCAN10 SCAN11 SCAN8 SCAN9
;THE SCANNER RECOGNIZES THREE CLASSES OF INPUT AND
; RETURNS RESULTS IN U1 AS FOLLOWS:
;1) SPECIAL CHARACTER: RETURNED IN RIGHT HALF OF U1,
; LEFT HALF = 0.
;2) NUMBER: RETURNED IN RIGHT HALF OF U1,
; LEFT HALF = 400000.
; (NUMBERS MUST BE LESS THAN 2↑18.)
;3) IDENTIFIER: LOOKED UP IN THE IDENTIFIER
; TABLE AND THE WORD INDICATED FOR IT
; IS RETURNED IN U1.
; THE LEFT HALF OF THIS WORD CONTAINS
; BITS SPECIFYING THE SITUATION UNDER
; WHICH THE IDENTIFIER IS VALID
; AND THE RIGHT HALF THE ADDRESS
; OF THE ROUTINE TO HANDLE IT.
; BIT 2 MEANS VALID AT TOP LEVEL.
; BIT 3 MEANS VALID FOR "SET" AND "TELL"
; COMMANDS.
; BITS 4-17 NOT YET ASSIGNED.
SCAN: SKIPN U1,LASCAR ;GET PREVIOUS CHARACTER.
SCAN1: PUSHJ PDP,TYI ;GET NEXT CHARACTER.
MOVE X1,SCNTBL(U1) ;GET TABLE ENTRY.
JUMPL X1,SCAN1 ;JUMP IF SKIP BEFORE IDENTS.
TLNE X1,200000 ;LETTER?
JRST SCAN2 ;YES.
TLNE X1,100000 ;NUMBER?
JRST SCAN3 ;YES.
SETZM LASCAR ;NO. SPECIAL CHARACTER.
POPJ PDP, ;RETURN IT IN U1.
PAGE
SCAN2: SETZM IDBUF ;CLEAR OUT IDENTIFIER BUFFER.
MOVE X2,[XWD IDBUF,IDBUF+1]
BLT X2,IDBUF+IDBUFL
MOVEI X2,IDBUFL*5 ;MAX CHAR COUNT.
MOVE X3,[POINT 7,IDBUF]
SCAN5:
IDPB U1,X3 ;STORE CONVERTED CHARACTER.
PUSHJ PDP,TYI
MOVE X1,SCNTBL(U1) ;GET TABLE ENTRY.
TLNE X1,300000 ;LETTER OR NUMBER?
SOJG X2,SCAN5 ;GO BACK IF MORE CHARACTERS.
SCAN7: TLNN X1,300000 ;ARE WE AT A SPECIAL CHARACTER?
JRST SCAN6 ;YES. FINISHED SCANNING.
PUSHJ PDP,TYI ;NO. EAT FURTHER CHARACTERS.
MOVE X1,SCNTBL(U1) ;GET TABLE ENTRY.
JRST SCAN7 ;SWALLOW IT.
SCAN6: MOVEM U1,LASCAR ;SAVE DELIMETER.
MOVEI X1,IDTBL ;SETUP TO SEARCH ID TABLE.
SCAN15: MOVE U1,IDBUF ;GET FIRST FIVE CHARACTERS.
SCAN10: HRRZ X2,(X1) ;GET TEXT OF FIRST IDENT.
JUMPE X2,SCAN9 ;END OF TABLE. UNDEFINED.
CAME U1,(X2) ;DOES IT MATCH?
AOJA X1,SCAN10 ;NO. KEEP LOOKING.
MOVEI X3,IDBUF+1 ;INSURE THAT ALL CHARS MATCH.
SCAN11: ADDI X2,1 ;CHECK NEXT FIVE.
SKIPN U1,(X2) ;END OF IDENT IN TABLE?
JRST SCAN8 ;YES.
CAMN U1,(X3) ;NO. DOES IT MATCH?
AOJA X3,SCAN11 ;YES. CHECK REST OF IT.
AOJA X1,SCAN15 ;NO. CHECK REST OF IDENTS.
SCAN8: SKIPE (X3) ;END OF IDENT IN BUFFER?
AOJA X1,SCAN15 ;NO. CHECK REST OF IDENTS.
;HERE WHEN THE IDENTIFIER IN THE BUFFER EXACTLY MATCHES ONE
;IN THE IDENTIFIER TABLE. TABLE ADDRESS IS IN U1.
HLRZ U1,(X1)
MOVE U1,(U1) ;GET ENTRY FROM TABLE.
POPJ PDP, ;SUCCESSFUL RETURN.
;COME HERE TO PRINT "UNDEFINED IDENTIFIER"
;ERROR MESSAGE FOR THE LAST IDENTIFIER
;SCANNED.
SCAN9: PUSHJ PDP,TERPRI
MOVEI U1,[ASCIZ /UNDEFINED IDENTIFIER: /]
PUSHJ PDP,PRINT
MOVEI U1,IDBUF
PUSHJ PDP,PRINT
JRST ERR ;NEVER RETURN TO CALLER.
;SCAN3 SCAN13 SCAN14 SCAN12 TYI TYI1
SCAN3: ;SCAN A NUMBER. LIMIT OF 2↑18.
MOVEI X1,-"0"(U1) ;CONVERT TO NUMERIC.
SCAN13: PUSHJ PDP,TYI ;READ A CHAR INTO U1.
MOVE X2,SCNTBL(U1) ;GET TABLE ENTRY.
TLNN X2,100000 ;DIGIT?
JRST SCAN12 ;NO. FINISHED SCANNING.
IMULI X1,12 ;NUMBER CONVERSION IN DECIMAL.
ADDI X1,-"0"(U1) ;ADD IN NEW DIGIT.
TLNN X1,-1 ;ANY BITS IN LEFT HALF.
JRST SCAN13 ;NO. KEEP SCANNING.
SCAN14: PUSHJ PDP,TYI ;NUMBER TOO LARGE. SKIP EXTRA DIGITS.
MOVE X2,SCNTBL(U1)
TLNE X2,100000 ;DIGIT?
JRST SCAN14 ;YES.
MOVEM U1,LASCAR ;NO. SAVE DELIMETER.
PUSHJ PDP,TERPRI ;PRINT ERROR MESSAGE.
MOVEI U1,[ASCIZ /NUMBER TOO LARGE/]
PUSHJ PDP,PRINT
JRST ERR
SCAN12: MOVEM U1,LASCAR ;SAVE DELIMETER.
HRRZ U1,X1 ;GET NUMBER INTO U1.
TLO U1,400000 ;SET APPROPRIATE FLAG.
POPJ PDP, ;RETURN.
;CHARACTER GETTER FOR SCANNER.
TYI: SOSG IBF+2
TYI1: INPUT 1,0
ILDB U1,IBF+1
JUMPE U1,TYI1
CAIG U1,172
CAIGE U1,141
SKIPA
SUBI U1,40
POPJ PDP,
;SCNTBL
XALL
SCNTBL: ;SCANNER TABLE.
XWD 400000,0 ;0
XWD 400000,0 ;1
XWD 400000,0 ;2
XWD 400000,0 ;3
XWD 400000,0 ;4
XWD 400000,0 ;5
XWD 400000,0 ;6
XWD 400000,0 ;7 (BELL)
XWD 400000,0 ;10
0 ;11 (TAB)
0 ;12 (LINE FEED)
XWD 400000,0 ;13
XWD 400000,0 ;14
0 ;15 (CARRIAGE RETURN)
REPEAT 40-15,<XWD 400000,0> ;NON-PRINTING.
REPEAT 17,<0> ;SPECIAL CHARACTERS.
REPEAT 12,<XWD 100000,0> ;DIGITS.
REPEAT 7,<0> ;SPECIAL CHARS.
REPEAT 32,<XWD 200000,0> ;LETTERS.
REPEAT 6,<0> ;SPECIAL CHARS.
REPEAT 32,<0> ;L.C. LETTERS.
REPEAT 5,<0> ;SPECIAL CHARS.
;IDBUF LASCAR HELP MTYPE MESS1 MESS2
IDBUFL==50/5 ;MAX OF 50 CHARS PER IDENTIFIER.
IDBUF: BLOCK IDBUFL
LASCAR: 0 ;LAST CHARACTER SEEN BY SCANNER.
PAGE
HELP: MOVEI U1,MESS2 ;PRINT REST OF MESSAGE.
PUSHJ PDP,PRINT
POPJ PDP, ;RETURN TO INTERPRETER.
MTYPE: MOVEI U1,6 ;ASSUME A PDP-6.
JFCL 1,.+1 ;CLEAR PC CHNG OR FOV.
JUMPA .+1 ;SET PC CHNG ONLY.
JFCL 1,.+2 ;IS IT SET?
MOVEI U1,12 ;NO. MUST BE A PDP-10.
POPJ PDP,
MESS1:
ASCIZ ?
THIS IS THE PDP-?
MESS2:
ASCIZ ? This program will accept the following commands:
Command Action requested
A Accept typed-in board (program will prompt)
(Example- 1,8,10,25K,27 )
A followed by a series of moves separated by commas (thus: A 11-15,22-18 etc.)
Accept typed sequence of moves
B List current board position
BD Picture current board position
DD Transfer to RAID for debugging
E Normal exit from program
G N Go to board before move number N and await next move or command
GAME Display the moves so far
PB (or PW) PDP-10 to play Black (or White). (to reverse sides during game)
PS PDP-10 to play itself (space bar will stop play at end of pending move)
RESET Reset all conditions for a new game
RESTORE Restore last game from disk (useful after crashes)
Other commands of less interest
D + (or D -) Increase (or decrease) depth (to play better or faster)
LEGAL List all currently legal moves
DEBUG Game tree to LPT with debugging info. Use sparingly as it ties up the LPT.
TREE List game tree on the terminal during play
PC Play using piece count only
SIG Use signature tables (default situation)
TP Tell (list) current settings of all parameters
SP To set parameters (program will prompt)
A move has the format M-N (where M & N are numbers specifying the starting and
ending squares) followed by a <carriage return>. For non-branching multiple
jumps M is the starting point and N is the first touch point. For branching
multiple jumps, all touch points plus the end point must be specified.
?
;IDTBL SYM'XX NOB BOOK USEBOK
;TO CHANGE THE LIST OF DEFINED IDENTIFIERS
;CHANGE THE MACRO DEFINITION BELOW.
DEFINE SYMBOLS <
X 100000,ACCEPT,A
X 100000,BOUT,B
X 100000,BDOUT,BD
X 100000,EXIT,E
X 100000,BEGIN,RESET
X 100000,HELP,HELP
X 100000,HELP,I
X 100000,HELP,?
X 100000,GO,G
X 100000,DDT,DD
X 100000,ACCEPT,ACCEPT
X 100000,PLAYBS,PS
X 20000,K,K
X 20000,PB,B
X 120000,SETPAR,SP
X 120000,LC,BOOK
X 120000,RECIN,IN
X 120000,RECIN,RESTORE
X 120000,SUM,GAME
X 120000,TELPAR,TP
X 120000,LIST,LIST
X 120000,SIG,SIG
X 120000,PC,PC
X 120000,DATA,DA
X 120000,SETB,SB
X 120000,SETW,SW
X 120000,DSAVE,DSAVE
X 120000,RSAVE,RSAVE
X 120000,DFILL,DFILL
X 120000,DIVIDE,DIVIDE
X 120000,SYM,SYM
X 120000,CTOTAL,TOTAL
X 120000,CRUNT,TIME
X 120000,CDIFF,DIFF
X 120000,CTELLC,COUNT
X 120000,DEBUG,DEBUG
X 120000,FIXDAT,TAPCON
X 120000,LCONTS,L
X 120000,LCONTZ,LZ
X 120000,LEGM,LEGAL
X 120000,LPTREE,LT
X 120000,LPTREE,WP
X 120000,LPTFIX,LPT
X 120000,D,D
X 120000,W,W
X 120000,PW,PW
X 120000,PB,PB
X 120000,MAG,M
X 120000,MAG,MTAPE
X 100000,DDT,DDT
X 120000,TRESET,TREE
X 120000,DSTREE,XTREE
X 120000,BK,BK
X 120000,TABLST,TAB
X 120000,TABFIX,XTAB
X 120000,PAR,PAR
X 120000,XPAR,XPAR
X 120000,CSFLAG,SCORE
X 120000,XEROX,XEROX
X 120000,BEGINL,LEARN
X 120000,LZERO,ZERO
X 120000,LZER2,Z2
X 120000,LZER3,Z3
X 120000,ZL,ZLABEL
X 120000,BEGINL,LRZ
X 120000,LOADTA,LRN
X 120000,NOB,NOB
X 120000,BOOK,YESB
X 120000,BEGL3,LN
>
EXTERNAL DDT
DEFINE X(A,B,C),<
Y(A,B,C,\XX)
XX==XX+1
>
DEFINE Y(A,B,C,XX),<
XWD [XWD A,B],SYM'XX
>
XX==0
IDTBL: SYMBOLS
EXP 0
DEFINE Y(A,B,C,XX),<
SYM'XX: ASCII /C/
EXP 0
>
XX==0
SYMBOLS
NOB: SETZM USEBOK
POPJ PDP,
BOOK: SETOM USEBOK
POPJ PDP,
USEBOK: -1 ;USE BOOK FLAG
;LPTFIX NOYES
;LPTFIX INITS THE LPT AND SETS LPFLAG SO THAT OUTPUT WILL GO TO THE LPT
;**********************************************************************
LPTFIX: SKIPE LPFLAG
JRST .+11
INIT 2,1
SIXBIT /LPT/
XWD LPTBUF,0
JRST .+12 ;LPT NOT PRESENTLY AVAILABLE
OUTBUF 2,4
SOS LPFLAG
SOS LPFLAG
POPJ PDP,
AOSN LPFLAG
JRST LPTFIX
SETZM LPFLAG
RELEASE 2,
POPJ PDP,
MOVEI U1,[ASCIZ /LPT NOT AVAILABLE/]
PUSHJ PDP,PRINT
PUSHJ PDP,TERPRI
MOVEI U1,[ASCIZ /KEEP TRYING? /]
PUSHJ PDP,PRINT
PUSHJ PDP,NOYES
POPJ PDP,
MOVE U1,LPTFIX+5
SUBI U1,15
MOVEM U1,LPTFIX+5
JRST LPTFIX+2
NOYES: PUSHJ PDP,TYI
CAIE U1,12 ;LF?
CAIN U1,15 ;CR?
JRST NOYES
CAIN U1,"Y"
AOS (PDP)
PUSHJ PDP,TYI
CAIE U1,15 ;<CR>?
JRST .-2 ;NO
POPJ PDP,
;EOL CHSET NOTICE DECIN OCTIN OCTOUT OCT0 OCT1 OCT2 OCT3
;***************************************************************
;A COMMAND IS TERMINATED BY A CR-LF. EOL WILL GO TO RETURN + 1*
;IF THE NEXT CHARACTER SCANNED IS A CR. IF A SUB-COMMAND IS *
;ENCOUNTERED, EOL WILL EXECUTE IT AND THEN GO TO RETURN + 1. *
;IF A NUMBER IS ENCOUNTERED, EOL WILL GO TO RETURN + 2 AND THE *
;NUMBER WILL BE IN U1. ANYTHING ELSE WILL PERPETRATE AN ERROR *
;MESSAGE. *
;***************************************************************
EOL: PUSHJ PDP,SCAN
CAIN U1,15 ;CR?
POPJ PDP, ;YES
CAIN U1,11 ;TAB?
JRST CHSET ;YES
TLNE U1,377777 ;IDENTIFIER?
JRST ERR ;YES
TLZN U1,400000 ;NUMBER?
JRST EOL ;NO
AOS (PDP) ;YES, SO FIX RETURN ADDRESS
POPJ PDP,
CHSET: PUSHJ PDP,SCAN
TLNE U1,20000
JRST (U1)
JRST ERR
NOTICE: MOVEM U1,U1S
MOVEM X1,X1S
MOVEI U1,[ASCIZ / NOT AVAILABLE IN THIS VERSION./]
PUSHJ PDP,PRINT
PUSHJ PDP,TERPRI
MOVE U1,U1S
MOVE X1,X1S
POPJ PDP,
DECIN: PUSHJ PDP,SCAN
JUMPGE U1,DECIN
HRRZS U1
POPJ PDP,
OCTIN: SKIPN U1,LASCAR
PUSHJ PDP,TYI
MOVE X1,SCNTBL(U1)
JUMPL X1,.-2
TLNE X1,100000
JRST .+3
SETZM LASCAR
JRST OCTIN
MOVEI X1,-"0"(U1)
PUSHJ PDP,TYI
MOVE X2,SCNTBL(U1)
TLNN X2,100000
JRST .+4
ASH X1,3
ADDI X1,-"0"(U1)
JRST .-6
MOVEM U1,LASCAR
HRRZ U1,X1
POPJ PDP,
OCTOUT: MOVEM X1,NUMX1
MOVEM X2,NUMX2
CAIL U1,0
JRST .+4
MOVNS U1
SETOM FLAG
JRST .+5
MOVEM U1,SAVU1
MOVEI U1,[ASCIZ / /]
PUSHJ PDP,PRIN2
MOVE U1,SAVU1
SETZB X2,X5
EXCH U1,X2
LSHC U1,22
OCT0: SETZM U1
LSHC U1,3
MOVEM X2,SAVX2
CAIE X5,↑D5
JUMPE U1,OCT1
SKIPE FLAG
JRST OCT3
PUSHJ PDP,OCT2
MOVE X2,SAVX2
CAIL X5,↑D5
JRST OCT2-3
TRO X2,7
AOJA X5,OCT0
OCT1: TRNE X2,777777
JRST OCT0+7
MOVEI U1,[ASCIZ / /]
PUSHJ PDP,PRIN2
MOVE X2,SAVX2
AOJA X5,OCT0
MOVE X1,NUMX1
MOVE X2,NUMX2
POPJ PDP,
OCT2: IDIVI U1,10
HRLM U1+1,(PDP)
JUMPE U1,.+2
PUSHJ PDP,OCT2
HLRZ X1,(PDP)
ADDI X1,"0"
JRST TYO
OCT3: MOVEM U1,SAVU1
MOVEI U1,[ASCIZ /-/]
PUSHJ PDP,PRIN2
MOVE U1,SAVU1
SETZM FLAG
JRST OCT0+7
;LIST PITRY STOPL LSTART
; SUBTTL LISTING ROUTINE
LIST: PUSHJ PDP,TYI
CAIG U1,71
CAIGE U1,60 ;IS IT A NUMBER
JRST LIST
MOVE U2,U1
PUSHJ PDP,TYI
CAIG U1,71
CAIGE U1,60
JRST .+4
LSH U2,7
IOR U2,U1
JRST .-6
MOVEM U2,LSTART
PUSHJ PDP,TERPRI
MOVEI U1,[ASCIZ /WHICH TAPE UNIT?/]
PUSHJ PDP,PRINT ;EITHER MTA0 OR MTA1
PUSHJ PDP,TERPRI
PUSHJ PDP,SCAN ;GOBBLE UP CR IN BUFFER
PUSHJ PDP,EOL ;GET CHAR. FROM TTY
JRST .+4 ;CR
CAIE U1,0 ;MTA0?
CAIN U1,1 ;NO, SO HOW ABOUT MTA1?
JRST .+3 ;A 0 OR A 1 WAS TYPED
MOVEI U1,[ASCIZ /TYPE "0" FOR MTA0, "1" FOR MTA1./]
JRST BEGINL+2 ;LET'S TRY AGAIN
MOVE U1,TPUNIT(U1) ;GET APPROPRIATE SIXBIT
MOVEM U1,MAGTAP+1 ;AND DEPOSIT INTO INIT CODE
PUSHJ PDP,MAGTAP ;NOW INIT THE TAPE UNIT
MTAPE 4,1 ;REWIND MAG TAPE
PITRY: PUSHJ PDP,NEWLIN ;GET 1ST CHAR. OF NEXT LINE
JRST STOPL+1
CAIE U1,"π" ;END OF TREE LISTING?
JRST .-3 ;NO, SO TRY AGAIN
PUSHJ PDP,MAGIN
JRST STOPL+1
MOVE U2,U1
PUSHJ PDP,MAGIN
JRST STOPL+1
CAIG U1,71
CAIGE U1,60
JRST .+4 ;LAST CHAR. WAS NOT A NUMBER
LSH U2,7
IOR U2,U1
JRST .-7
CAME U2,LSTART ;START LISTING NOW?
JRST PITRY
PUSHJ PDP,NEWLIN
JRST STOPL+1
SKIPN LPFLAG
PUSHJ PDP,LPTFIX ;INIT LPT
SKIPG LPFLAG
SETCMM LPFLAG ;FLAG NOW SET FOR LPT OUTPUT
MOVE X1,U1
PUSHJ PDP,TYO
PUSHJ PDP,MAGIN
SKIPA
JRST .-4
STOPL: RELEAS 2,
MTAPE 4,17
POPJ PDP,
LSTART: Z
;DUMP DUMP0 DUMP1 DUMP2 DUMP3 PRNAM3 PRNAM1 PRNAM2 SPT PRNAME TYPE
; SUBTTL DUMP ROUTINE
DUMP: MOVEM K,ACSAV+16
MOVEI K,ACSAV
BLT K,ACSAV+15
PUSH PDP,LPFLAG
SKIPG LPFLAG ;SKIP IF LPT ALREADY INITED
PUSHJ PDP,LPTFIX
MOVEI U1,1
MOVEM U1,LPFLAG
PUSHJ PDP,TERPRI
PUSHJ PDP,TERPRI
PUSHJ PDP,TERPRI
MOVE X1,ACSAV+1
MOVE X2,ACSAV+3
MOVE K,ACSAV+16
MOVE U3,START
DUMP0: MOVE U4,U3
TRZ U4,777770
MOVE U5,U3
SKIPN @U3
AOJA U3,.-1
ADDI U5,10
CAML U3,U5
PUSHJ PDP,TERPRI
MOVE U5,U3
TRZ U5,777770
CAME U4,U5
SOJA U3,.-3
SETZM Z
JRST DUMP2
TRNN Z,7
JRST DUMP0
DUMP1: SETZB U1,U5
SKIPA X2,@U3
MOVE X2,X2S
LSHC U1,3
MOVEM X2,X2S
AOS U5
PUSHJ PDP,OCT2
CAIE U5,↑D12
JRST .-6
MOVEI U1,[ASCIZ / /]
PUSHJ PDP,PRINT
AOS U3
CAMLE U3,FINISH
JRST DUMP3
AOJA Z,DUMP1-2
DUMP2: PUSHJ PDP,TERPRI
MOVE U1,U3
PUSHJ PDP,PRNAME
MOVEI U1,[ASCIZ ./ .]
PUSHJ PDP,PRINT
SUBI P,13
MOVEI U1,[ASCIZ / /]
PUSHJ PDP,PRINT
AOJLE P,.-2
JRST DUMP1
DUMP3: PUSHJ PDP,TERPRI
PUSHJ PDP,TERPRI
MOVSI K,ACSAV
BLT K,K
POP PDP,LPFLAG
POPJ PDP,
PRNAM3: MOVEI X5,777777
HRRZ X3,JOBSYM ;GET ADDRESS OF LOWEST REGISTER USED
HLRO X4,JOBSYM ;NEGATIVE COUNT OF LENGTH OF SYMBOL TABLE
MOVMS X4 ;NOW IT'S A POSITIVE COUNT
ADD X4,X3 ;WHERE TO STOP
SOS X4
MOVE A,@X3 ;LOAD FIRST ENTRY
PRNAM1: AOS X3
CAML X3,X4 ;HAVE WE RUN THROUGH THE TABLE YET?
JRST PRNAM2 ;YES
CAMGE U1,@X3 ;IS THIS THE SYMBOL WE ARE LOOKING FOR?
AOJA X3,PRNAM1 ;NO
MOVE I,U1 ;MAYBE
SUB I,@X3 ;I ← U1 - X3
CAML I,X5 ;IS THIS CLOSER TO WHAT WE WANT?
AOJA X3,PRNAM1 ;NO
MOVE A,-1(X3) ;SO SAVE SYMBOL
MOVE X5,I ;AND SAVE DELTA
AOJA X3,PRNAM1
PRNAM2: CAILE X5,7777 ;IS SYMBOL CLOSE ENOUGH TO USE?
JRST OCTOUT ;NO
SETZM P ;TO COUNT HOW MANY CHARACTERS ARE PRINTED
MOVE X1,A ;PUT SYMBOL IN U1
TLZ X1,740000 ;ZERO CODE BITS
SPT: IDIVI X1,50 ;THE REMAINDER IS THE NEXT CHAR.
AOS P
HRLM U1,(PDP) ;STORE IN LH. OF PDL
SKIPE X1 ;ANY NON-BLANK CHARS. LEFT?
PUSHJ PDP,SPT ;YES, SO GET NEXT CHAR.
HLRZ X1,(PDP) ;LOAD FROM LH. OF PDL
JUMPE X1,TYPE ;BLANK
ADDI X1,57
CAILE X1,71
ADDI X1,101-72
CAILE X1,132
SUBI X1,134-44
CAIN X1,43
MOVEI X1,56
JRST TYO
PRNAME: PUSHJ PDP,PRNAM3
SKIPN X5
POPJ PDP,
CAIGE X5,10000
JRST .+13
MOVEI P,1
CAIL U3,10
AOS P
CAIL U3,100
AOS P
CAIL U3,1000
AOS P
CAIL U3,10000
AOS P
POPJ PDP,
MOVEI U1,[ASCIZ /+/]
PUSHJ PDP,PRINT
MOVE U1,X5
PUSHJ PDP,OCT2 ;PRINT DELTA
ADDI P,2 ;FIX CHARACTER COUNT
CAIL X5,10
AOS P ;FIX IT AGAIN IF IT NEEDS IT
CAIL X5,100
AOS P
CAIL X5,1000
AOS P
POPJ PDP,
TYPE: MOVEI X1,40(X1) ;CONVERT SIXBIT TO ASCII
JRST TYO
;OUTIN GETTTY MAG MAGTAP MAGIN GETOK DNUM MAGOUT PUTOK NEWLIN NOTAVL INERR WRTPRO PARERR INVBLK
;***************************************************************
;OUTIN CONVERTS FROM EXTERNAL TO INTERNAL CHECKER BOARD NUMBERS.
;***************************************************************
OUTIN: TLZ U1,-1
CAIGE U1,↑D25
JRST .+3
ADDI U1,3
POPJ PDP,
CAIGE U1,↑D17
JRST .+3
ADDI U1,2
POPJ PDP,
CAIL U1,↑D9
ADDI U1,1
POPJ PDP,
SUBTTL MAG TAPE ROUTINES
GETTTY: INIT 1,1 ;INITIALIZE TELETYPE.
SIXBIT /TTY/
XWD OBF,IBF
HALT ;NOT ENOUGH CORE?
INBUF 1,2
OUTBUF 1,2
POPJ PDP,
MAG: PUSHJ PDP,EOL
POPJ PDP,
MTAPE 4,(U1)
JRST MAG
MAGTAP: INIT 4,0 ;INIT MAG TAPE IN ASCII MODE
SIXBIT /MTA0/
XWD MGOBUF,MGIBUF
JRST NOTAVL
INBUF 4,2
POPJ PDP,
MAGIN: SOSLE MGIBUF+2 ;DECREMENT BYTE COUNT
JRST GETOK ;DATA ALREADY IN THE BUFFER
INPUT 4, ;REFILL THE BUFFER
STATZ 4,740000 ;INPUT ERRORS?
JRST INERR ;YES
STATZ 4,20000 ;EOF?
POPJ PDP, ;YES
GETOK: ILDB U1,MGIBUF+1 ;GET CHAR. FROM BUFFER
JUMPE U1,MAGIN ;BAD CHAR. TO HAVE HANGING AROUND
AOS (PDP) ;FIX RETURN ADRESS
POPJ PDP, ;RETURN
DNUM: IDIVI U1,12 ;ALWAYS DECIMAL.
HRLM U1+1,(PDP) ;SAVE REMAINDER
JUMPE U1,.+2
PUSHJ PDP,DNUM ;RECUR TO GET MORE DIGITS.
HLRZ U1,(PDP)
ADDI U1,"0" ;CONVERT TO ASCII.
MAGOUT: SOSLE MGOBUF+2 ;DECREMENT BYTE COUNT
JRST PUTOK ;BUFFER NOT YET FULL
OUTPUT 5, ;BUFFER FULL, SO EMPTY
STATZ 5,740000 ;OUTPUT ERRORS?
HALT
PUTOK: IDPB U1,MGOBUF+1 ;PUT CHAR. IN BUFFER
POPJ PDP,
NEWLIN: SKIPG MGIBUF ;FIRST INPUT?
JRST .+5 ;YES
PUSHJ PDP,MAGIN ;GET CHAR. FROM INPUT BUFFER
POPJ PDP, ;EOF FOUND
CAIE U1,12 ;A LINE FEED?
JRST NEWLIN+2 ;NO
PUSHJ PDP,MAGIN ;YES, SO GET FIRST CHAR. OF NEW CARD
POPJ PDP, ;EOF RETURN
AOS (PDP) ;FIX RETURN ADDRESS
POPJ PDP, ;RETURN
NOTAVL: MOVEI U1,[ASCIZ /MTA NOT AVAILABLE/]
PUSHJ PDP,PRINT
PUSHJ PDP,TERPRI
JRST BEGINN ;START OVER
INERR: STATZ 4,400000
JRST WRTPRO
STATZ 4,200000
JRST PARERR
STATZ 4,100000
JRST INVBLK
MOVEI U1,[ASCIZ /DATA BLOCK TOO LARGE./]
PUSHJ PDP,PRINT
PUSHJ PDP,TERPRI
POPJ PDP,
WRTPRO: MOVEI U1,[ASCIZ /MTA0 ON WRITE PROTECT./]
PUSHJ PDP,PRINT
PUSHJ PDP,TERPRI
POPJ PDP,
PARERR: MOVEI U1,[ASCIZ /PARITY ERROR./]
PUSHJ PDP,PRINT
PUSHJ PDP,TERPRI
POPJ PDP,
INVBLK: MOVEI U1,[ASCIZ /INVALID BLOCK./]
PUSHJ PDP,PRINT
PUSHJ PDP,TERPRI
POPJ PDP,
;FIXDAT NEWCAR NEXCHR TRCARD TRCAR1 CRLF STAR STAR0 STAR1 GETLIN DBP DONE FLUSH FLUSH1
;SUBTTL LEARNING DATA CONVERT ROUTINES
FIXDAT: SETZM U1
HRLM U1,MAGTAP+2 ;SO THAT MTA0 WILL BE INITED FOR INPUT ONLY
PUSHJ PDP,MAGTAP ;INIT MTA0
INIT 5,0 ;NOW INIT MTA1
SIXBIT /MTA1/
XWD MGOBUF,0
JRST NOTAVL ;ERROR RETURN FOR INIT
OUTBUF 5,2 ;SET UP 2 BUFFERS FOR OUTPUT
MTAPE 4,1
MTAPE 5,1
NEWCAR: MOVEI U3,0 ;USED IN TRCARD
PUSHJ PDP,GETLIN ;GET NEW LINE & PUT IN "INPL"
JRST DONE ;NO MORE DATA
MOVE U2,[POINT 7,INPL]
MOVEM U2,LBYT ;REINITIALIZE BYTE POINTER
ILDB U1,LBYT ;GET FIRST CHAR.
CAIN U1," " ;TRUNK OR VARIATION CARD?
JRST TRCARD ;YES
CAIN U1,"*" ;"*" IN FIRST COL.
JRST FLUSH ;YES
SETOM U2 ;TO COUNT 2 CONSECUTIVE BLANKS
NEXCHR: ILDB U1,LBYT ;GET NEXT CHAR.
CAIN U1," " ;SECOND CONSECUTIVE BLANK?
AOJG U2,CRLF ;JUMP IF YES
CAIN U1,"+" ;A STAR?
JRST STAR ;YES
CAIN U1,12 ;A LINE FEED?
JRST FLUSH ;YES, SO GET NEW LINE
CAIN U1," "
JRST NEXCHR
JRST NEXCHR-1 ;NO, SO GET NEXT CHAR.
TRCARD: LDB U1,[POINT 7,INPL+5,27] ;GET CHAR. #37
CAIE U1," " ;A BLANK?
AOJA U3,TRCAR1-1 ;NO, SO IT MUST BE A VARIATION CARD
MOVEI U1,"#"
DPB U1,LBYT
MOVNI U2,45
TRCAR1: ILDB U1,LBYT ;GET NEXT CHAR.
AOJL U2,TRCAR1
CRLF: MOVEI U1,15 ;GET CR
DPB U1,LBYT
MOVEI U1,12 ;GET LINE FEED
IDPB U1,LBYT
JRST FLUSH
STAR: MOVE U1,LBYT
MOVEM U1,D1BYT ;SET UP INITIAL D1BYT
STAR0: PUSHJ PDP,DBP ;SET UP D2BYT
LDB U1,D2BYT ;BACK UP 1 CHAR.
CAIN U1," " ;A BLANK?
JRST STAR1 ;YES
DPB U1,D1BYT ;NO, SO DEPOSIT
MOVE U1,D2BYT
MOVEM U1,D1BYT ;SET UP D1BYT
JRST STAR0 ;AND DO AGAIN
STAR1: MOVEI U1,"*"
DPB U1,D1BYT ;REPLACE FIRST DIGIT WITH "*"
ILDB U1,LBYT
CAIE U1," "
JRST .-2
JRST NEXCHR-1 ;ALL FINISHED, SO RETURN
GETLIN: MOVE U1,[POINT 7,INPL] ;INITIALIZE BYTE POINTER
MOVEM U1,LBYT
PUSHJ PDP,MAGIN ;GET NEXT CHAR.
POPJ PDP, ;EOF RETURN
IDPB U1,LBYT ;PUT CHAR. IN EDITING BUFFER
CAIE U1,12 ;A LINE FEED?
JRST GETLIN+2 ;NO
AOS (PDP) ;FIX RETURN ADDRESS
POPJ PDP, ;RETURN
DBP: IBP U1
IBP U1
IBP U1
IBP U1
SOS U1
MOVEM U1,D2BYT ;UPDATE D2BYT
POPJ PDP, ;AND RETURN
DONE: CLOSE 5, ;FLUSH OUT BUFFER & WRITE EOF
MTAPE 4,1 ;REWIND INPUT TAPE
POPJ PDP, ;RETURN
FLUSH: MOVNI U3,↑D72
MOVE U2,[POINT 7,INPL]
ILDB U1,U2
PUSHJ PDP,MAGOUT
AOJGE U3,FLUSH1
CAIE U1,12
JRST .-4
JRST NEWCAR
FLUSH1: CAIN U1,12
JRST NEWCAR
MOVEI U1,15
PUSHJ PDP,MAGOUT
MOVEI U1,12
PUSHJ PDP,MAGOUT
JRST NEWCAR
;D1BYT D2BYT INPL MGIBUF MGOBUF SAVBUF TPUNIT DATE MONTH EXIT
D1BYT: Z
D2BYT: Z
ASCII / / ;5 BLANKS FOR STAR ROUTINE
INPL: BLOCK 30
MGIBUF: BLOCK 3
MGOBUF: BLOCK 3
SAVBUF: BLOCK 3
TPUNIT: SIXBIT /MTA0/
SIXBIT /MTA1/
DATE: MOVEM X1,ACSAV
MOVEM U1,ACSAV+1
CALL X1,[SIXBIT /DATE/]
IDIVI X1,↑D31
ADDI U1,1
PUSHJ PDP,NUMOUT
IDIVI X1,↑D12
MOVEI U1,MONTH(U1)
PUSHJ PDP,PRINT
MOVE U1,X1
ADDI U1,↑D64
MOVEI X1," "
PUSHJ PDP,TYO
PUSHJ PDP,NUMOUT
MOVE X1,ACSAV
MOVE U1,ACSAV+1
POPJ PDP,
MONTH: ASCIZ / JAN/
ASCIZ / FEB/
ASCIZ / MAR/
ASCIZ / APR/
ASCIZ / MAY/
ASCIZ / JUN/
ASCIZ / JUL/
ASCIZ / AUG/
ASCIZ / SEP/
ASCIZ / OCT/
ASCIZ / NOV/
ASCIZ / DEC/
EXIT: CALLI 12
;PUP PRF PLF PLB
PUP: MOVE A,PLA-1(X3)
MOVE P,PLP-1(X3)
MOVE K,PLK-1(X3)
MOVE U1,[POINT 4,MJ]
MOVEM U1,MJBP ;INIT BYTE POINTER
MOVE U1,[POINT 6,MJBP,5]
MOVEM U1,BPBP ;INIT BYTE POINTER'S BYTE POINTER
SKIPE U1,PLRF-1(X3)
JRST PRF
SKIPE U1,PLLF-1(X3)
JRST PLF
SKIPE U1,PLLB-1(X3)
JRST PLB
SKIPN U1,PLRB-1(X3)
POPJ PDP, ;NO MOVE RETURN
MOVEM U1,SAVE
HRLI I,PLRB-1(X3)
HRRI I,4300 ;RB FLAG BIT IN I
SUBI U1,1
ANDM U1,PLRB-1(X3) ;CORRECTED RB WORD WITH MOVE BIT GONE
ADDI U1,1
XOR U1,PLRB-1(X3) ;MOVE BIT ONLY IN U1
MOVEI U2,5 ;MAGIC NUMBER IN U2
JRST UPDATE
PRF: MOVEM U1,SAVE
HRLI I,PLRF-1(X3)
HRRI I,700 ;RF FLAG BIT IN I
SUBI U1,1
ANDM U1,PLRF-1(X3) ;CORRECTED RF WORD WITH MOVE BIT GONE
ADDI U1,1
XOR U1,PLRF-1(X3) ;MOVE BIT ONLY IN U1
MOVEI U2,-4 ;MAGIC NUMBER IN U2
JRST UPDATE
PLF: MOVEM U1,SAVE
HRLI I,PLLF-1(X3)
HRRI I,1300 ;LF FLAG BIT IN I
SUBI U1,1
ANDM U1,PLLF-1(X3) ;CORRECTED LF WORD WITH MOVE BIT GONE
ADDI U1,1
XOR U1,PLLF-1(X3) ;MOVE BIT ONLY IN U1
MOVEI U2,-5 ;MAGIC NUMBER IN U2
JRST UPDATE
PLB: MOVEM U1,SAVE
HRLI I,PLLB-1(X3)
HRRI I,2300 ;LB FLAG BIT IN I
SUBI U1,1
ANDM U1,PLLB-1(X3) ;CORRECTED LB WORD WITH MOVE BIT GONE
ADDI U1,1
XOR U1,PLLB-1(X3) ;MOVE BIT ONLY IN U1
MOVEI U2,4 ;MAGIC NUMBER IN U2
JRST UPDATE
;UPDATE UPDAT2 DEEPER TENIN RFMJ LFMJ LBMJ FOO MJPF RFPF LFPF LBPF NOPF PDP10
; SUBTTL OVERFLOW ENTRY TO UPDATE
;****************************************************************
; UPDATE IS CALLED ONLY FROM MUP AND PUP. MUP AND PUP LOAD *
; REGISTERS U1, U2, AND I. WHEN UPDATE IS CALLED, U1 HAS ONLY *
; THE BIT CORRESPONDING TO THE PIECE MOVING SET. U2 CONTAINS *
; EITHER 4, 5, -4, OR -5. UPDATE USES THIS NUMBER TO DETERMINE *
; THE DIRECTION OF THE MOVE. REGISTER I HAS BITS SET TO ENABLE *
; UPDATE TO RESTORE THE MOVE WORD IN THE CASE OF BRANCHING *
; MULTIPLE JUMPS. REGISTERS A, P, AND K MUST BE LOADED WITH *
; THE CURRENT BOARD POSITION BEFORE EITHER MUP OR PUP IS CALLED *
;****************************************************************
UPDATE: AOS (PDP) ;ADD 1 TO RETURN ADDRESS
SETZM MJ ;INITIALIZE FOR MULTIPLE JUMP HANDLING
AOS COUNT ;COUNT VISITS TO UPDATE
SKIPN TREE
JRST .+4
MOVE U3,PLY(X2)
ADD U3,X3
AOS COUNTS(U3)
EXCH A,P ;A IS NOW PASSIVE & P IS NOW ACTIVE
UPDAT2: TDNE K,U1 ;IS PIECE MOVING A KING?
TRZA I,300 ;YES
TRNE U2,400000 ;SKIP IF U2 GREATER THAN 0
TRZA I,200 ;SET FORWARD BIT
TRZ I,100 ;SET BACKWARD BIT
TDZ P,U1 ;ZERO BIT'S POSITION
TDZ K,U1 ;DO IT AGAIN
LSH U1,(U2) ;SHIFT BY MAGIC NUMBER
TDZ K,U1 ;ZERO PIECE BEING JUMPED, IF ANY
TDZE A,U1 ;DO IT AGAIN & TEST FOR JUMP
TROA I,20 ;SET JUMP FLAG
JRST .+2
LSH U1,(U2) ;SHIFT AGAIN BY MAGIC NUMBER
TDO P,U1 ;SET DESTINATION BIT
TDNN U1,KINGSQ ;DOES PIECE WANT TO BE A KING?
JRST .+3 ;NO
TRZE I,300 ;IS PIECE ALREADY A KING?
TRZ I,20 ;NO, SO TURN OFF JUMP FLAG
TRNN I,300 ;IS PIECE A KING?
TDO K,U1 ;YES, SO SET DESTINATION BIT
TRNN I,100060 ;WAS MOVE A JUMP?
POPJ PDP, ;NO, SO RETURN
TRNN I,20 ;WAS IT AN MJ MOVE ENDING IN KINGSQ?
JRST FOO ;YES, SO STORE MJ INFO. & EXIT
SKIPN MJW-1(X3) ;HAVE MULTIPLE JUMPS ALREADY BEEN FOUND?
JRST .+3 ;NO
TRNN I,40 ;YES, BUT FROM PREVIOUS MOVE?
JRST MJPF ;YES
DEEPER: SETZB U3,U4
MOVE Z,X2 ;SAVE X2 IN CASE WE'RE USING A PDP-10
SKIPE SIXTEN ;PDP-?
JFFO U1,PDP10 ;10
MOVE Z,U1 ;6
TRNE I,200 ;BUILD MASK WORD IN U3
JRST .+10 ;PIECE CAN'T MOVE FORWARD
LSH Z,-4 ;RF POSITION
MOVE U3,Z
LSH Z,-1 ;LF POSITION
IOR U3,Z
TRNE I,100 ;CAN PIECE MOVE BACKWARDS?
JRST .+6 ;NO
MOVE Z,U1
LSH Z,4 ;LB POSITION
IOR U3,Z
LSH Z,1 ;RB POSITION
IOR U3,Z ;MASK WORD NOW IN U3
TDNN A,U3 ;MULTIPLE JUMPS?
JRST FOO ;NO, SO PREPARE TO EXIT
MOVE Z,U1 ;BUILD MASK WORD IN U4
TRNE I,200 ;CAN PIECE MOVE FORWARD?
JRST .+10 ;NO
LSH Z,-10 ;DESTINATION BIT FOR RF JUMP
MOVE U4,Z
LSH Z,-2 ;DESTINATION BIT FOR LF JUMP
IOR U4,Z
TRNE I,100 ;CAN PIECE MOVE BACKWARD?
JRST .+6 ;NO
MOVE Z,U1
LSH Z,10 ;DESTINATION BIT FOR LB JUMP
IOR U4,Z
LSH Z,2 ;DESTINATION BIT FOR RB JUMP
IOR U4,Z ;MASK WORD NOW IN U4
TENIN: MOVE Z,P
ORCM Z,GUARD ;SO THAT GUARD BITS WON'T LOOK LIKE EMPTY SPACES
ANDCB Z,A ;EMPTY SPACES
TDNN Z,U4 ;MULTIPLE JUMPS?
JRST FOO ;NO, SO PREPARE TO EXIT
AND U3,A ;SURROUNDING PASSIVE PIECES
AND U4,Z ;SPACES TO JUMP INTO
TRZ I,17 ;ZERO MJ BITS SINCE WE ARE NOW 1 PLY DEEPER
ROT U3,-4
TDNE U4,U3 ;RFMJ?
TRO I,1 ;YES
ROT U3,-1
TDNE U4,U3 ;LFMJ?
TRO I,2 ;YES
ROT U3,11
TDNE U4,U3 ;LBMJ?
TRO I,4 ;YES
ROT U3,1
TDNE U4,U3 ;RBMJ?
TRO I,10 ;YES
TRNN I,17 ;ANY MULTIPLE JUMPS?
JRST FOO ;NO, SO PREPARE TO EXIT
IDPB I,MJBP ;DEPOSIT APPROPRIATELY IN MJ
TRO I,40 ;SET MJ FLAG
TRZE I,1 ;RFMJ?
JRST RFMJ
TRZE I,2 ;LFMJ?
JRST LFMJ
TRZE I,4 ;LBMJ?
JRST LBMJ
MOVEI U2,5 ;NO, THEN IT MUST BE A RBMJ
JRST UPDAT2
RFMJ: MOVEI U2,-4
JRST UPDAT2
LFMJ: MOVEI U2,-5
JRST UPDAT2
LBMJ: MOVEI U2,4
JRST UPDAT2
MOVE X2,Z ;RESTORE X2 FROM PDP10 CODE
FOO: SKIPN MJ ;ANY MULTIPLE JUMPS FOUND?
POPJ PDP, ;NOPE, SO BYE
LDB U3,BPBP ;GET BYTE POINTER'S P FIELD
SUBI U3,44
MOVMS U3
ROT MJ,(U3) ;MJ NOW RIGHT JUSTIFIED
TRZE MJ,1 ;IF RF BIT ON, ZERO IT ...
JRST .+6 ;... AND JUMP
TRZE MJ,2 ;IF LF BIT ON, ZERO IT ...
JRST .+4 ;... AND JUMP
TRZE MJ,4 ;IF LB BIT ON, ZERO IT ...
JRST .+2 ;... AND JUMP
TRZ MJ,10 ;IF RB BIT ON, ZERO IT
TRNE MJ,17 ;LAST BIT ON IN BYTE?
JRST .+6 ;NO
SKIPN MJ ;LAST BYTE ON IN WORD?
JRST .+10 ;YES, SO RETURN
LSH MJ,-4 ;NO, SO SHIFT BYTE INTO LIMBO
SUBI U3,4 ;TELL U3 ABOUT THE SHIFT
JRST .-15 ;REPEAT PROCESS
MOVNS U3
ROT MJ,(U3) ;MJ RESTORED
ADDI U3,44
DPB U3,BPBP ;MJBP RESTORED
MOVEM MJ,MJW-1(X3) ;STORE MJ WORD FOR FUTURE UPDATE
SKIPN MJ ;LAST OF BMJ?
POPJ PDP, ;YES
MOVE U3,SAVE ;NO, SO LEAVE MOVE BIT ON
HLRZS I ;L.H. HAS ADDRESS WHERE MOVE BIT CAME FROM
MOVEM U3,@I
POPJ PDP, ;RETURN
MJPF: TRO I,100000 ;SET MJPF FLAG
MOVE MJ,MJW-1(X3) ;LOAD MJ WORD
ILDB U3,MJBP ;LOAD DIRECTION BYTE
JUMPE U3,NOPF ;JUMP IF NO PATH TO FOLLOW
TRNE U3,1 ;FIND MOVE TO BE MADE
JRST RFPF
TRNE U3,2
JRST LFPF
TRNE U3,4
JRST LBPF
MOVEI U2,5 ;MUST BE RBPF
JRST UPDAT2
RFPF: MOVEI U2,-4
JRST UPDAT2
LFPF: MOVEI U2,-5
JRST UPDAT2
LBPF: MOVEI U2,4
JRST UPDAT2
NOPF: LDB U3,BPBP ;MUST DECREMENT THE BYTE POINTER
ADDI U3,4
DPB U3,BPBP
TRO I,40
JRST DEEPER
PDP10: TRNN I,200 ;CAN PIECE MOVE FORWARDS?
MOVE U3,FJUMP1(X2) ;YES
TRNN I,100 ;CAN PIECE MOVE BACKWARDS?
IOR U3,BJUMP1(X2) ;YES
TDNN A,U3 ;ANY PIECES CLOSE ENOUGH TO JUMP?
JRST FOO-1 ;NO
MOVE U4,JUMP2(X2) ;U4 IS MASK WHERE PIECE COULD LAND IF IT JUMPED
MOVE X2,Z ;RESTORE X2
JRST TENIN ;AND REJOIN THE REST OF THE PROGRAM
;COUNTS SAVE BJUMP1 FJUMP1 JUMP2 SIXTEN KINGSQ
;TEMPORARY SPACES USED BY UPDATE
Z
Z
COUNTS: BLOCK 40
SAVE: Z
BJUMP1: Z
Z
Z
Z
Z
Z
Z
Z
Z
FJUMP1: Z
4000000000
6000000000
3000000000
1000000000
200000000
300000000
140000000
40000000
Z
4000000
6000000
3000000
1000000
200000
300000
140000
40000
Z
4000
6000
3000
1000
200
300
140
40
JUMP2: Z
100000000
240000000
120000000
40000000
4000000
12000000
5000000
2000000
Z
100000100000
240000240000
120000120000
40000040000
4000004000
12000012000
5000005000
2000002000
Z
100000100
240000240
120000120
40000040
4000004
12000012
5000005
2000002
Z
100000
240000
120000
40000
4000
12000
5000
2000
SIXTEN: Z
KINGSQ: 360000000017
;LEGAL LEG1 LEG2 LEG3 LEG4 LEG5 LEG6 GUARD
;*****************************************************
; LEGAL IS A SUBROUTINE WHICH FINDS ALL LEGAL *
; MOVES. IT USES REGISTERS U1 TO X5 INCL P AND Z *
; WHICH IT DOES NOT SAVE. ON LEAVING U1 CONTAINS *
; FOREWARD ACTIVE PIECES, U2 CONTAINS BACKWARD ACTIVE*
; PIECES AND P CONTAINS PASSIVE PIECES. Z CONTAINS *
; EMPTY SQUARES. REGISTER PDP IS USED FOR ENTRY *
; WHILE X3 INDEXES INPUT AND OUTPUT DATA. *
;*****************************************************
LEGAL: SETZM MJW(X3) ;MUST ZERO SINCE BITS MAY BE LEFT FROM BACK UP
AOS (PDP)
SETZB U3,U4
SETZB U5,Q
MOVE U1,A
MOVE U2,K
AND U2,U1 ;ACTIVE KINGS
MOVE Z,U1
IOR Z,P
XOR Z,GUARD ;EMPTY SQUARES
MOVE X5,COLOR
XOR X5,X3
ANDI X5,1 ;NEEDED LATER
TRNE X5,1
EXCH U1,U2
JUMPE U1,LEG1
MOVE U3,Z
LSH U3,4
AND U3,P
LSH U3,4
AND U3,U1
LEG1: MOVEM U3,PLRF(X3)
JUMPE U1,LEG2
MOVE U4,Z
LSH U4,5
AND U4,P
LSH U4,5
AND U4,U1
LEG2: MOVEM U4,PLLF(X3)
JUMPE U2,LEG3
MOVE U5,Z
LSH U5,-4
AND U5,P
LSH U5,-4
AND U5,U2
LEG3: MOVEM U5,PLLB(X3)
JUMPE U2,LEG4
MOVE Q,Z
LSH Q,-5
AND Q,P
LSH Q,-5
AND Q,U2
LEG4: MOVEM Q,PLRB(X3)
SKIPE Q ;ARE THERE ANY JUMPS
POPJ PDP, ;JUMP RETURN
SKIPE U5
POPJ PDP,
SKIPE U4
POPJ PDP,
SKIPE U3
POPJ PDP,
AOS (PDP)
JUMPE U1,LEG5
MOVE U3,Z
LSH U3,4
AND U3,U1
MOVEM U3,PLRF(X3)
MOVE U4,Z
LSH U4,5
AND U4,U1
MOVEM U4,PLLF(X3)
LEG5: JUMPE U2,LEG6
MOVE U5,Z
LSH U5,-4
AND U5,U2
MOVEM U5,PLLB(X3)
MOVE Q,Z
LSH Q,-5
AND Q,U2
MOVEM Q,PLRB(X3)
LEG6: SKIPE Q
JRST EV
SKIPE U5
JRST EV
SKIPE U4
JRST EV
SKIPE U3
JRST EV
SOS (PDP)
SOS (PDP)
POPJ PDP, ;NO MOVE RETURN
GUARD: 377377377377
;PLGRD PLA PLP PLK PLRF PLLF PLLB PLRB EEB EEB2 PLSKIP TA TP TK PLY PLAS PLPS PLKS PLSKS PLRFS PLLFS PLLBS PLRBS PLMJS COUNT ORDER ORDER2 BEST BEST2 TRUNK COLOR WORST TISKIP XTWIG OJ BESTM WORSTM BESTO EW X1S X2S X2SS X3S X4S U1S U2S U2SS ZS STOP SI LASTP DOTFLG FLITEV PLEVAL TIPEV DEPTH PRUNE WIDTH TAPER MJBP BPBP PLFLG FLAG REFLAG LPFLAG DWFLAG SFLAG WHOWON EEBFLF MJW
;PLAUS SPACE IS INDEXED BY PLY IN X3
PLGRD: Z ;GUARD TO PERMIT -1 STORE
PLA: BLOCK 20 ;ACTIVE PIECES
PLP: BLOCK 20 ;PASSIVE PIECES
PLK: BLOCK 20 ;KINGS
PLRF: BLOCK 20
PLLF: BLOCK 20
PLLB: BLOCK 20
PLRB: BLOCK 20
Z ;GUARD
Z
EEB: BLOCK 20
Z
Z
EEB2: BLOCK 20
PLSKIP: BLOCK 20
;TEMPORARY STORAGE FOR RF ETC.
TA: BLOCK 400
TP: BLOCK 400
TK: BLOCK 400
Z
Z
PLY: BLOCK 300
PLAS: Z
PLPS: Z
PLKS: Z
PLSKS: Z
PLRFS: Z
PLLFS: Z
PLLBS: Z
PLRBS: Z
PLMJS: Z
;MISC. SINGLE WORDS NEEDED FOR VARIOUS PURPOSES.
COUNT: Z ;COUNT OF UPDATES
ORDER: Z ;4-BIT POINTERS TO TOP 8 TRUNKS
ORDER2: Z ;THE NEXT 8 TRUNKS
BEST: Z ;SECOND BEST SCORE
BEST2: Z ;BEST OF ORDER2
TRUNK: Z ;RECORD OF CURRENT TRUNK
COLOR: Z
WORST: Z ;RECORD OF WORST TRUNK
TISKIP: Z ;SKIP ON ENTERING TIP
XTWIG: Z ;TO SAVE X3 AT TWIG
OJ: Z
BESTM: Z ;BEST INDEX FROM MAIN SORT
WORSTM: Z ;WORST INDEX FROM MAIN SORT
BESTO: Z ;BEST INDEX FROM OVERFLOW SORT
EW: BLOCK 3
X1S: Z ;SAVE SPACE FOR INDEX VALUES
X2S: Z
X2SS: Z
X3S: Z
X4S: Z
U1S: Z
U2S: Z
U2SS: Z
ZS: Z ;TO SAVE SCORE
STOP: Z
SI: 0
LASTP: Z
DOTFLG: Z
FLITEV: 14
PLEVAL: 14
TIPEV: 14
DEPTH: 6
PRUNE: 1
WIDTH: 2
TAPER: 1
MJBP: 0
BPBP: 0
PLFLG: Z
FLAG: 0
REFLAG: 0
LPFLAG: 0
DWFLAG: 0
SFLAG: -1
WHOWON: Z
EEBFLF: Z
Z
Z
MJW: BLOCK 20
;SCORE S GOOD BAD WIN LOSE ZZ OA OP OK ORF OLF OLB ORB OS DA DP DK SIDE START FINISH ACSAV SAVU1 SAVX2 BITSON
;SCORES INDEXED BY PLY PART OF X2 ONLY
-377777777774
-377777777775
-377777777776
SCORE: -377777777777
S: BLOCK 40 ;SCORE USED IN ALPHA-BETA
GOOD: 377777777700
BAD: -377777777700
WIN: 377777777777
LOSE: -377777777777
-377777777774
-377777777775
-377777777776
ZZ: BLOCK 20 ;APPARENT SCORES
; FINAL OUTPUT BOARD
OA: 377360000000
OP: 17377
OK: Z
ORF: Z
OLF: Z
OLB: Z
ORB: Z
OS: Z
;DUMMY BOARD FOR STARTING NEW GAME
DA: 377360000000 ;ASSUMES BLACK TO START
DP: 000000017377
DK: Z
SIDE: 1 ;ZERO IF BLACK IS TO PLAY
START: LABEL
FINISH: LABEL+SIGSIZ*10
ACSAV: BLOCK 20
SAVU1: Z
SAVX2: Z
BITSON: BLOCK 401
;
;ONLY COMMON ROUTINES HANDLING INPA ETC GO HERE
EXTERN INPSIZ
;FINDX1 CNT FINDX2 FINDX3 INS1AB INS1B INS1C INS1F INS1G INS3 INS3K1 INS3K2 INS3K3 INS3K INS3X INS3Y INS3Z
;Modified for 4 or 5 words per entry instead of 2 or 3
;INP file contains INPA, INPP, INPM, IMPV and INPK for boards with kings.
;and ANPA, INPP, INPM and INPV for boards without kings.
;INPM has 6 fields, 1@9 for trunk#, 1@9 for serial#, 1@6 Blank and 2@6 for move.
;INPV has 6 fields @6 for 6 variation numbers.
;BLOWUP==↑D10 ;RELATIVE SIZE OF INPSIZ IN L AND P
;INPSIZ==↑D1024*BLOWUP ;INPSIZ=↑D1020 IN CKP
;BOKSIZ=↑D512 ;2**N FOR CONVENIENCE
;INPMAX==↑D768*BLOWUP ;MAX SIZE ALLOWED ON DMPFIL
;INPCNT: Z ;Current count of words occupied
FINDX1:
MOVEI U1,[ASCIZ /
CNT=/]
PUSHJ PDP,PRINT
MOVE U1,INPCNT
PUSHJ PDP,NUMOUT
MOVE Z,INPCNT
ADDI Z,4 ;Words per entry for non-king boards
JUMPE U4,FINDX2
ADDI Z,1 ;One more word if king board
MOVEM Z,INPCNT
TRNE Z,1
ADDI Z,5 ;To guarentee even number of entries
JRST FINDX3
FINDX2: MOVEM Z,INPCNT ;INPCNT allowing for addition
TRNE Z,4
ADDI Z,4 ;To guarentee even number of entries
FINDX3: LSH Z,-1 ;Divide by 2
INS1AB:
MOVE X1,INPCNT
SUB X1,Z ;X1 is too large
INS1B:
JUMPE U4,.+4
TRNE Z,1
ADDI Z,5 ;MAKE MULTIPLE OF 10
JRST .+3
TRNE Z,4
ADDI Z,4 ;Make multiple of 8
LSH Z,-1
CAMN U2,INPA(X1) ;FIND: X1|INPA(X1)>U2>INPA+1(X1)
JRST INS3 ;SIMPLE CASE
CAMG U2,INPA(X1) ;X1 TOO LARGE OR TOO SMALL?
JRST INS1F ;TOO SMALL, go forward
JRST INS3X ;TOO LARGE, test the next earlier one
INS1C:
SUB X1,Z ;TOO LARGE, go backward
JRST INS1B ;INSERTED MAY 17
JUMPN U4,.+4
CAIGE X1,4
MOVEI X1,4
JRST INS1B
CAIGE X1,5
MOVEI X1,5
JRST INS1B
INS1F:
ADD X1,Z ;TOO SMALL, SO MAKE IT BIGGER
JUMPN U4,.+4
CAILE X1,INPCNT-4
MOVEI X1,INPCNT-4
JRST INS1B
CAILE X1,INPCNT-5
MOVEI X1,INPCNT-5
JRST INS1B
INS1G:
MOVE X1,INPCNT ;To go at the end
POPJ PDP,
INS3:
CAMN U3,INPP(X1)
JRST INS3K
CAMG U3,INPP(X1)
JRST INS1F ;TOO SMALL
JRST INS3X ;Too large so test the next earlier one
INS3K1: AOS X1
INS3K2: ADDI X1,4
INS3K3: MOVEI U1,10000 ;USE THIS BIT FOR A DUPLICATE FLAG
IORM U1,BOOKM(X3)
POPJ PDP,
INS3K: JUMPE U4,INS3K2 ;Set equals flag and advance X1 by 4
CAMN U4,INPK(X1)
JRST INS3K1 ;Set equals flag and advance X! by 5
CAMG U4,INPK(X1)
JRST INS1F ;TOO SMALL, go forward
INS3X: SKIPN X1 ;This may be it so test next earlier location
POPJ PDP, ;Woops, we are back far enough
MOVE X5,INPA-4(X1) ;FOR NON-KING CASE
SKIPE U4
MOVE X5,INPA-5(X1) ;KING CASE
CAMN U2,X5
JRST INS3Y
CAMG U2,X5
POPJ PDP, ;It goes in here
JRST INS1C
INS3Y:
MOVE X5,INPP-4(X1) ;NON-KING CASE AGAIN
SKIPE U4
MOVE X5,INPP-5(X1) ;KING CASE
CAMLE U3,X5
JRST INS1C
; SKIPE U4
CAME U3,X5
POPJ PDP,
SKIPN U4
JRST INS3K3
INS3Z:
CAMLE U4,INPK-5(X1)
; POPJ PDP, ;It goes in here
JRST INS1C ;TOO LARGE, go backward
CAME U4,INPK-5(X1)
POPJ PDP,
JRST INS3K3
;CRIP X4NORM
CRIP: SIXBIT / 00/
SIXBIT / 01/
SIXBIT / 02/
SIXBIT / 03/
SIXBIT / 04/
SIXBIT / 05/
SIXBIT / 06/
SIXBIT / 07/
SIXBIT / 08/
SIXBIT / 09/
SIXBIT / 10/
SIXBIT / 11/
SIXBIT / 12/
SIXBIT / 13/
SIXBIT / 14/
SIXBIT / 15/
SIXBIT / 16/
X4NORM: SETZ Z, ;NORMALIZE X4 FOR COLOR REVERSAL
MOVE U1,PLRF
SETZ X4,
JUMPE U1,.+14
CAQ X1,X4
MOVEM X4,X4RF
MOVE U1,PLLF
SETZ X4,
JUMPE U1,.+14
CAQ X1,X4
MOVEM X4,X4LF
MOVE U1,PLLB
SETZ X4,
JUMPE U1,.+14
CAQ X1,X4
MOVEM X4,X4LB
ADD X4,X4LF
ADD X4,X4RF
MOVEM X4,X4ALL
MOVE U3,X4LB
JUMPE U3,.+5
AOS Z
MOVEM Z,X4TAB(X4)
SOS X4
SOJG U3,.-3
MOVE U1,PLRB
SETZ X4,
JUMPE U1,.+14
CAQ X1,X4
MOVEM X4,X4RB
ADDM X4,X4ALL
MOVE U3,X4RB
MOVE X4,X4ALL
JUMPE U3,.+5
AOS Z
MOVEM Z,X4TAB(X4)
SOS X4
SOJG U3,.-3
MOVE X4,X4RF
JUMPE X4,.+4
AOS Z
MOVEM Z,X4TAB(X4)
SOJG X4,.-2
MOVE X4,X4RF
ADD X4,X4LF
MOVE U3,X4LF
JUMPE U3,.+5
AOS Z
MOVEM Z,X4TAB(X4)
SOS X4
SOJG U3,.-3
SOS X4ALL ;SAVE TOTAL LESS ONE
POPJ PDP,
;X4ALL X4RF X4LF X4LB X4RB X4TAB BITTAB REVTAB REVERK REVERA REVERP REVBP RBP
X4ALL: Z ;TOTAL NUMBER OF MOVES
X4RF: Z
X4LF: Z
X4LB: Z
X4RB: Z
X4TAB: BLOCK 20 ;SIDE REVERSAL TABLE
BITTAB: 400000000000
200000000000
100000000000
40000000000
20000000000
10000000000
4000000000
2000000000
1000000000
400000000
200000000
100000000
40000000
20000000
10000000
4000000
2000000
1000000
400000
200000
100000
40000
20000
10000
4000
2000
1000
400
200
100
40
20
10
4
2
1
REVTAB: Z
40
37
36
35
34
33
32
31
30
27
26
25
24
23
22
21
20
17
16
15
14
13
12
11
10
7
6
5
4
3
2
1
REVERK: MOVE U1,K
JRST .+4
REVERA: MOVE U1,A
JRST .+2
REVERP: MOVE U1,P
SETZ Z,
MOVEI U5,3
LDB X1,RBP(U5)
MOVE X1,CFTAB2(X1)
ROT X1,8
DPB X1,REVBP(U5)
SOJGE U5,.-4
POPJ PDP,
REVBP: POINT 8,Z,35
POINT 8,Z,26
POINT 8,Z,17
POINT 8,Z,8
RBP: POINT 8,U1,8
POINT 8,U1,17
POINT 8,U1,26
POINT 8,U1,35
POINT 8,U1,35
;WHERES GETWHR WHERIN WHRINS
WHERES=↑D1024 ;SIZE OF WHERE TABLE
GETWHR: INIT 12,17
SIXBIT /DSK/
Z
HALT
MOVE U1,[SIXBIT /CHK/]
MOVEM U1,WHERIN+1
; MOVE U1,[055000000000]
; MOVEM U1,WHERIN+2
SETZM WHERIN+2
MOVE U1,[SIXBIT / 1ALS/]
MOVEM U1,WHERIN+3
LOOKUP 12,WHERIN
POPJ PDP,
INPUT 12,WHRINS
RELEAS 12,
POPJ PDP,
WHERIN: SIXBIT /DIREC3/
SIXBIT /CHK/
055000000000
SIXBIT / 1ALS/
WHRINS: IOWD WHERES,INDEXX
Z
END BEGIN